/**
 * 包装器的基本语法
 * function<返回值类型(参数列表)> 包装器名称=包装器所要包装的函数
 */
#include <bits/stdc++.h>
#include <functional>//包装器的头文件
using namespace std;
void show(const string& str){
    cout<<str<<endl;
}
class Person{
    public:
    static void show(const string& str){
        cout<<str<<endl;
    }
    void operator()(const string& str){
        cout<<str<<endl;
    }
    void new_show(const string& str){
        cout<<str<<endl;
    }
};
int main(){
    //普通全局函数
    void(*fp1)(const string&)=show;//定义函数指针，指向全局函数show
    fp1("这是函数指针");

    //包装器包装普通函数
    function<void(const string&)> fp2=show;//定义包装器，指向全局函数show
    fp2("这是包装器,包装了普通函数");//用包装调用函数

    //包装器包装类的静态成员函数
    function<void(const string&)> fp3=Person::show;//包装器包装类的成员函数
    fp3("这是包装器,包装了类的静态成员函数");

    //包装器包装仿函数
    function<void(const string&)> fp4=Person();//包装器包装仿函数
    fp4("这是包装器,包装了仿函数");

    //包装器包装lambda对象
    function<void(const string&)> fp5=[](const string& str)->void{cout<<str<<endl;};
    fp5("这是包装器,包装了lambda对象");

    //包装器包装类的成员函数--类的成员函数和其他函数包装方法有所不同
    Person p;
    function<void(Person&,const string&)> fp6=&Person::new_show;//包装器包装类的成员函数
    fp6(p,"这是包装器,包装了类的成员函数");
    return 0;
}